home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / PROGRAMM / ASSEMBLE / H235A.ZIP / ASM_0_M.ZIP / DAZZLER.ASM < prev    next >
Assembly Source File  |  1987-11-09  |  5KB  |  116 lines

  1. CSeg   Segment Para Public 'CODE'
  2.        Assume CS:CSeg,DS:CSEG,SS:CSeg,ES:Nothing
  3.        Org   100h
  4. Begin: Mov   AX,001h         ; Set video mode 1
  5.        Int   10h
  6.        Mov   AX,0B800h       ; Set ES to start of
  7.        Mov   ES,AX           ;   video page 0
  8. ;
  9. ; Put the pattern into video page 0 and 1
  10. ;
  11.        Mov   AL,219          ; Character is a solid block
  12.        Mov   DX,0            ; Initialize row counter
  13. RLoop: Mov   DI,DX           ; DI = row
  14.        Mov   AH,DL           ; Color = row
  15.        Mov   CL,4            ; 2 ^ 4 = 16
  16.        SAL   DI,CL           ; DI = 16 * row
  17.        Mov   CX,DI           ; Save in CX
  18.        SAL   DI,1            ; DI = 32 * row
  19.        SAL   DI,1            ; DI = 64 * row
  20.        Add   DI,CX           ; DI = (64+16=80) * row
  21.        Mov   CX,DI           ; CX = 80 * row
  22.        Mov   BX,0            ; Init the column counter
  23. CLoop: Inc   AH              ; Increment color number
  24.        And   AH,15           ; Valid colors are 0-15 only
  25.        Mov   DI,CX           ; DI = 80 * row
  26.        Add   DI,BX           ; DI = 80 * row + column
  27.        StoSW                 ; Move word to page 0
  28.        Add   DI,2046
  29.        StoSw                 ; Move word to page 1
  30.        Mov   DI,CX           ; DI = 80 * row
  31.        Add   DI,78           ; DI = 80 * row + 78
  32.        Sub   DI,BX           ; DI = 80 * row - column + 78
  33.        StoSw                 ; Move word to page 0
  34.        Add   DI,2046
  35.        StoSw                 ; Move word to page 1
  36.        Mov   DI,CX           ; DI = 80 * row
  37.        Neg   DI              ; DI = -80 * row
  38.        Add   DI,1920         ; DI = -80 * row + 1920
  39.        Add   DI,BX           ; DI = -80 * row + column + 1920
  40.        StoSw                 ; Move word to page 0
  41.        Add   DI,2046
  42.        StoSw                 ; Move word to page 1
  43.        Mov   DI,CX           ; DI = 80 * row
  44.        Neg   DI              ; DI = -80 * row
  45.        Add   DI,1998         ; DI = -80 * row + 1998
  46.        Sub   DI,BX           ; DI = -80 * row - column + 1998
  47.        StoSw                 ; Move word to page 0
  48.        Add   DI,2046
  49.        StoSw                 ; Move word to page 1
  50.        Add   BX,2            ; increment counter
  51.        Cmp   BX,40           ; Columns done ?
  52.        Je    ChkRow          ; Yes...check rows
  53.        Jmp   CLoop           ; No....check column
  54. ChkRow: Inc  DX              ; Increment row
  55.        Cmp   DX,13           ; Rows done ?
  56.        Je    MoveIt          ; Yes..move the patterns
  57.        Jmp   RLoop           ; No...Next row
  58. ;
  59. ; Increment or decrement the valu of bits 0-3 for every attribute
  60. ; byte on alternating video pages 0 and 1 and swap active page.
  61. ;
  62. MoveIt: Mov   BX,2049         ; BX = page offset
  63.         Mov   SI,0            ; Set flag to no swap
  64. MLoop:  Cmp   BX,2049         ; Page 1 displayed ?
  65.         Je    Pg0             ; Yes, display page 0
  66.         Mov   BX,2049         ; No..display page 1
  67.         Mov   AL,1            ; Set page 1
  68.         Jmp   SetPg
  69. Pg0:    Mov   BX,1            ; Set page offset
  70.         Mov   AL,0            ; Set page 0
  71. SetPg:  Mov   DI,BX
  72.         Mov   CX,1000         ; 1000 bytes to move
  73. ILoop:  Mov   DH,ES:[DI]      ; Get attribute byte
  74. IncDec: Inc   DH              ; Modify attribute byte (self modifying here)
  75.         Jns   NotNeg          ; Sign is plus
  76.         Mov   DH,15           ; Sign is negative
  77. NotNeg: And   DH,15           ; Valid values are 0-15
  78.         Mov   ES:[DI],DH      ; Place in the new attribute
  79.         Inc   DI              ; Point past the character
  80.         Inc   DI              ; And to the next attribute
  81.         Loop  ILoop           ; Repeat this 1000 times
  82.         Mov   AH,5            ; Set video page
  83.         Int   10h
  84.         Mov   CX,02701h       ; Time delay (lower this value for more speed)
  85. Delay:  Loop  Delay           ; And wait
  86. ;
  87. ; Check for keypress - if a space, swap the code for inc and dec
  88. ; at label INCDEC - if ESC then exit.
  89. ;
  90.          Cmp  SI,1            ; Is flag set ?
  91.          Jz   Swap            ; Yes..swap INC/DEC code
  92.          Mov  AH,6            ; ReadKeyboard function
  93.          Mov  DL,0FFh         ; Set DL to read
  94.          Int  21h             ; Call DOS
  95.          Cmp  AL,' '          ; Space bar hit ?
  96.          Jne  ChkEsc          ; No...check for ESC key
  97.          Cmp  BX,2049         ; Are we displaying page 1 ?
  98.          Je   Swap            ; Yes...swap INC/DEC code
  99.          Mov  SI,1            ; No...set flag
  100.          Jmp  MLoop           ; Continue
  101. Swap:    Mov  SI,0            ; Reset flag
  102.          Cmp  Byte Ptr IncDec+1,0C6h   ; Are we incrementing ?
  103.          Je   DecIt           ; Yes..swap functions
  104.          Mov  Byte Ptr IncDec+1,0C6h   ; Change to increment
  105.          Jmp  Mloop           ; And redo the display
  106. DecIt:   Mov  Byte Ptr IncDec+1,0CEh   ; Change to decrement
  107.          Jmp  MLoop           ; And redo the display
  108. ChkEsc:  Cmp  AL,27           ; ESC key pressed ?
  109.          Jne  MLoop           ; No..redo the display
  110.          Mov  AX,0003h        ; Yes..set to 80 column display
  111.          Int  10h             ; Call BIOS
  112.          Mov  AX,4C00h        ; Prepare to exit
  113.          Int  21h             ; Terminate program
  114. CSeg     Ends
  115.          End  Begin
  116.